/*********************************************************
 * 初学之家(http://www.g2room.com)，提供Java、Javascript（js）、Jquery、
 * 等一些工具或常用功能的实现例子代码，希望能给初学者提供学习和工作上的帮助，
 * 也希望有想提供源代码的朋友能联系我，一起努力，提供更多、更全面、更详细的
 * 一些初学代码例子及经验，帮助更多的人。
 * 
 * 我的联系方式：E-Mail：g2room@163.com
 * 网址：http://www.g2room.com
 * QQ：天涯（1173930590）
 * QQ交流群：323642758
 * 
 * 本站内容为提供各种java、javascript(JS)常用的工具源代码、实例（示例）、
 * 基本配置、教程、手册等；目前Java代码提供的工具（或转换）例子代码如下：
 * BASE64转换工具、bytes相关操作、email收发、文件操作（读写、拷贝、遍历、
 * 多线程copy等）、json格式转换、日志（Log4j）操作工具、Lucene搜索引擎的
 * 创建索引和搜索、各种不同Map的使用、定时器（Quartz）的使用例子、Socket的
 * 连接传输数据例子、WebService的例子及一些常用的工具类如String、Date及
 * JDK自带的一些工具类及函数的使用例子。
 * 
 * 说明：如需直接使用本站的例子代码，请保留此说明
 * 
 ********************************************************/
package com.g2room.io.file.op;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

import com.g2room.utils.StringUtil;

/**
 * 
 * 
 * @createTime: Oct 24, 2013 8:44:36 AM
 * @author: <a href="mailto:g2room@163.com">天涯</a>
 * @version: 0.1
 * @lastVersion: 0.1
 * @updateTime:
 * @updateAuthor: <a href="mailto:g2room@163.com">天涯</a>
 * @changesSum:
 * 
 */
public class FileOp {
	public static int cc = 0;

	public static void Sereach(File f) {
		if (f.isFile()) {
			String str = f.getName().substring(f.getName().length() - 4);
			System.out.println(str);
			if (str.equals("java")) {
				System.out.println("删除" + f.getName());
				cc++;
			}
		}
		if (f.isDirectory()) {
			File[] ss = f.listFiles();
			for (int i = 0; i < ss.length; i++) {
				Sereach(ss[i]);
			}
		}
	}
	
	/**
	 * 拷贝目录下的所有文件和文件夹到目标文件夹中
	 * @param source
	 * @param target
	 * @param fileName
	 */
	public static void copyFiles(String source, String target, String dir) {
		System.out.println(source + "===" +dir);
		File f = new File(source);
		if (f.isFile()) {
			if(!target.endsWith("/")) {
				if(!f.exists()) {
					f.mkdirs();
				}
				target = target.substring(0, target.lastIndexOf("/"));
			}
			copyFile(source, target + dir);
		} else {
			File[] files = f.listFiles();
			for(File file : files) {
				if(file.isDirectory()) {
					if(StringUtil.isNotEmpty(dir)) {
						dir = dir + "/";
					}
					dir += file.getName();
					if(!target.endsWith("/")) {
						target += "/";
					}
					File targetFile = new File(target + dir);
					if(!targetFile.exists()) {
						targetFile.mkdirs();
					}
				}
				copyFiles(file.getAbsolutePath(), target, dir);
			}
		}
	}
	/**
	 * 
	 * 复制文件，此种方式适合复制大文件
	 *
	 * @param source	要复制的源文件
	 * @param target	复制的目标目录
	 * @return	复制成功返回true；反之返回false；
	 * @auther <a href="mailto:gaoxg@FOUNDER.COM.CN">Gao Xuguo</a>
	 * Jun 18, 2013 11:40:21 AM
	 */
	public static boolean copyFile(String source, String target) {
		boolean rs = true;	
		File file = new File(source);
		long start = System.currentTimeMillis();
		// 缓冲区大小，设置为10M
		int buffSize = 10485760;
//		System.out.println("拷贝文件" + file.getName() + "大小为：" 
//				+ (file.length() / 1048576) + "M");
		//得到输入通道
		FileChannel in = null;
		//得到输出通道
		FileChannel out = null;
		try {
	        in = new FileInputStream(file).getChannel();
	        out = new FileOutputStream(target 
	        		+ "/"
	        		+ file.getName()).getChannel();  
	        // 设定缓冲区
	        ByteBuffer buffer = ByteBuffer.allocate(buffSize);
	        while(in.read(buffer) != -1){
	        	//准备写入，防止其他读取，锁住文件
	            buffer.flip();
	            out.write(buffer);
	            //准备读取。将缓冲区清理完毕，移动文件内部指针
	            buffer.clear();
	        }
		} catch (IOException e) {
			e.printStackTrace();
			rs = false;
			System.out.println("拷贝文件" + file.getName() 
					+ "出错，信息：" + e.getMessage());
		} finally {
			try {
				if(null != out) out.close();
			} catch (IOException e) {
				e.printStackTrace();
				System.out.println("关闭输出流out出错，信息：" 
						+ e.getMessage());
			}
			try {
				if(null != in) in.close();
			} catch (IOException e) {
				e.printStackTrace();
				System.out.println("关闭输入流in出错，信息：" 
						+ e.getMessage());
			}
		}
		return rs;
	}
	
	/** 
	 * 复制一个目录及其子目录、文件到另外一个目录
	 * @param src
	 * @param dest
	 * @throws IOException
	 */
	private static void copyFolder(File src, File dest) throws IOException {
		if (src.isDirectory()) {
			if (!dest.exists()) {
				dest.mkdir();
			}
			String files[] = src.list();
			for (String file : files) {
				File srcFile = new File(src, file);
				File destFile = new File(dest, file);
				// 递归复制
				copyFolder(srcFile, destFile);
			}
		} else {
			InputStream in = new FileInputStream(src);
			OutputStream out = new FileOutputStream(dest);
			byte[] buffer = new byte[1024];
			int length;
			while ((length = in.read(buffer)) > 0) {
				out.write(buffer, 0, length);
			}
			in.close();
			out.close();
		}
	}

	public static void main(String[] args) throws Exception {
//		System.out.println(/apps/var/search/logs);
		System.out.println(FileOp.class.getProtectionDomain()
				.getCodeSource().getLocation());
//		copyFolder(new File("E:/var/test/logs/"), new File("E:/var/test/log/"));
// copyFolder("E:/var/test/logs/", "E:/var/test/log/");

	}
}
